package clasesAuxiliares;

import implementacion.InfoRuta;
import implementacion.Ruta;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import capaPresentacion.shared.ParPuntosDTO;
import capaPresentacion.shared.RutaFicheroDTO;

import com.google.gwt.user.client.rpc.IsSerializable;

public class RutaFichero implements IsSerializable {

	private InfoRuta infoRuta;
	private Ruta ruta;
	private File ficheroRuta;
	private String url = "/var/www/rutas";
	private List<ParPuntos> puntos;

	public RutaFichero(Ruta ruta) {

		this.setInfoRuta(null);
		this.ruta = ruta;
		this.url = url + ruta.getNombreFichero();
		puntos = new ArrayList<ParPuntos>();
		leerFichero();
	}

	public RutaFichero(InfoRuta infoRuta) {
		this.setInfoRuta(infoRuta);
		this.ruta = infoRuta.getRuta();
		this.url = url + ruta.getNombreFichero();
		puntos = new ArrayList<ParPuntos>();
		leerFichero();
	}

	private void leerFichero() {
		File f = abrirFichero();
		Document dom = parsearFichero(f);
		Element elem = dom.getDocumentElement();

		NodeList items = elem.getElementsByTagName("trkpt");
		for (int i = 0; i < items.getLength(); i++) {
			Node nodo = items.item(i);
			NamedNodeMap atributos = nodo.getAttributes();
			Node lati = atributos.getNamedItem("lat");
			Node longi = atributos.getNamedItem("lon");
			float latitud = Float.parseFloat(lati.getTextContent());
			float longitud = Float.parseFloat(longi.getTextContent());
			ParPuntos p = new ParPuntos(longitud, latitud);
			puntos.add(p);
		}
	}

	protected Document parsearFichero(File f) {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder;
		try {
			builder = factory.newDocumentBuilder();
			try {
				Document dom = builder.parse(f);
				return dom;
			} catch (SAXException e) {
				e.printStackTrace();

			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}
		return null;
	}

	protected File abrirFichero() {
		try {
			File f = new File(this.url);
			return f;
		} catch (Exception ex) {
			System.out.println("Error al abrir fichero");
		}
		return null;
	}

	public Ruta getRuta() {
		return ruta;
	}

	public File getFicheroRuta() {
		return ficheroRuta;
	}

	public String getUrl() {
		return url;
	}

	public List<ParPuntos> getPuntos() {
		return puntos;
	}

	public void setRuta(Ruta ruta) {
		this.ruta = ruta;
	}

	public void setFicheroRuta(File ficheroRuta) {
		this.ficheroRuta = ficheroRuta;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public void setPuntos(List<ParPuntos> puntos) {
		this.puntos.clear();
		this.puntos.addAll(puntos);
	}

	public InfoRuta getInfoRuta() {
		return infoRuta;
	}

	public void setInfoRuta(InfoRuta infoRuta) {
		this.infoRuta = infoRuta;
	}

	public RutaFicheroDTO rutaFicheroDTO() {
		List<ParPuntosDTO> parPuntosDTO = new ArrayList<ParPuntosDTO>();
		for (ParPuntos p : puntos)
			parPuntosDTO.add(p.parPuntosDTO());
		if (this.infoRuta != null)
			return new RutaFicheroDTO(this.infoRuta.infoRutaDTO(),
					this.ruta.rutaDTO(), parPuntosDTO);
		else
			return new RutaFicheroDTO(null, this.ruta.rutaDTO(), parPuntosDTO);
	}
}
